#ifndef Scene_h__
#define Scene_h__

#include "SceneTypes.h"

class CSceneEntity;

class CScene
{
public:
	CScene(SceneID sceneID, const std::string& strSceneName);
	~CScene();

	bool                Init();
	bool                Load(const std::string& filepath);
	void                Destroy();

	void                Update(float fTime);
	void                Render();

	SceneID             GetID()     { return m_SceneID; }
	const std::string&  GetName()   { return m_strName; }
		
	template<typename EntityClass>
	EntityClass*        CreateEntity(const std::string& entityName, ESceneEntityType entityType);
	
	CSceneEntity*       GetEntityByID(SceneID entityID);
	void                DestroyEntity(SceneID entityID);
	void                DestroyEntity(CSceneEntity* pSceneEntity);
	
private:
	EntityID           _GenerateEntityID();
	void               _ClearDeferedEntities();
private:
	SceneID                            m_SceneID;
	std::string                        m_strName;

	EntityID                           m_EntityIDSeed;
	std::map<EntityID, CSceneEntity*>  m_EntityMap;
	std::vector<CSceneEntity*>         m_DeferedDeleteEntities;
};

template<typename EntityClass>
EntityClass* CScene::CreateEntity( const std::string& entityName, ESceneEntityType entityType )
{
	EntityID entityID = _GenerateEntityID();
	EntityClass* pEntity = new EntityClass(entityID, entityName, entityType);

	m_EntityMap[entityID] = pEntity;
	return pEntity;
}


#endif // Scene_h__
